home *** CD-ROM | disk | FTP | other *** search
-
- PTRACE(2) UNIX Programmer's Manual PTRACE(2)
-
- NNAAMMEE
- ppttrraaccee - process tracing and debugging
-
- SSYYNNOOPPSSIISS
- ##iinncclluuddee <<ssyyss//ttyyppeess..hh>>
- ##iinncclluuddee <<ssyyss//ppttrraaccee..hh>>
-
- _i_n_t
- ppttrraaccee(_i_n_t _r_e_q_u_e_s_t, _p_i_d___t _p_i_d, _c_a_d_d_r___t _a_d_d_r, _i_n_t _d_a_t_a)
-
- DDEESSCCRRIIPPTTIIOONN
- ppttrraaccee() provides tracing and debugging facilities. It allows one pro-
- cess (the _t_r_a_c_i_n_g process) to control another (the _t_r_a_c_e_d process). Most
- of the time, the traced process runs normally, but when it receives a
- signal (see sigaction(2)), it stops. The tracing process is expected to
- notice this via wait(2) or the delivery of a SIGCHLD signal, examine the
- state of the stopped process, and cause it to terminate or continue as
- appropriate. ppttrraaccee() is the mechanism by which all this happens.
-
- The _r_e_q_u_e_s_t argument specifies what operation is being performed; the
- meaning of the rest of the arguments depends on the operation, but except
- for one special case noted below, all ppttrraaccee() calls are made by the
- tracing process, and the _p_i_d argument specifies the process ID of the
- traced process. _r_e_q_u_e_s_t can be:
-
- PT_TRACE_ME This request is the only one used by the traced process; it
- declares that the process expects to be traced by its par-
- ent. All the other arguments are ignored. (If the parent
- process does not expect to trace the child, it will proba-
- bly be rather confused by the results; once the traced pro-
- cess stops, it cannot be made to continue except via
- ppttrraaccee().) When a process has used this request and calls
- execve(2) or any of the routines built on it (such as
- execv(3)), it will stop before executing the first instruc-
- tion of the new image. Also, any setuid or setgid bits on
- the executable being executed will be ignored.
-
- PT_READ_I, PT_READ_D
- These requests read a single int of data from the traced
- process' address space. Traditionally, ppttrraaccee() has al-
- lowed for machines with distinct address spaces for in-
- struction and data, which is why there are two requests:
- conceptually, PT_READ_I reads from the instruction space
- and PT_READ_D reads from the data space. In the current
- NetBSD implementation, these two requests are completely
- identical. The _a_d_d_r argument specifies the address (in the
- traced process' virtual address space) at which the read is
- to be done. This address does not have to meet any align-
- ment constraints. The value read is returned as the return
- value from ppttrraaccee().
-
- PT_WRITE_I, PT_WRITE_D
- These requests parallel PT_READ_I and PT_READ_D, except
- that they write rather than read. The _d_a_t_a argument sup-
- plies the value to be written.
-
- PT_READ_U This request reads an int from the traced process' user
- structure. The _a_d_d_r argument specifies the location of the
- int relative to the base of the user structure; it will
- usually be an integer value cast to caddr_t either explic-
- itly or via the presence of a prototype for ppttrraaccee(). Un-
- like PT_READ_I and PT_READ_D, _a_d_d_r must be aligned on an
- int boundary. The value read is returned as the return
- value from ppttrraaccee().
-
- PT_WRITE_U This request writes an int into the traced process' user
- structure. _a_d_d_r specifies the offset, just as for
- PT_READ_U, and _d_a_t_a specifies the value to be written, just
- as for PT_WRITE_I and PT_WRITE_D.
-
- PT_CONTINUE The traced process continues execution. _a_d_d_r is an address
- specifying the place where execution is to be resumed (a
- new value for the program counter), or (caddr_t)1 to indi-
- cate that execution is to pick up where it left off. _d_a_t_a
- provides a signal number to be delivered to the traced pro-
- cess as it resumes execution, or 0 if no signal is to be
- sent.
-
- PT_KILL The traced process terminates, as if PT_CONTINUE had been
- used with SIGKILL given as the signal to be delivered.
-
- PT_ATTACH This request allows a process to gain control of an other-
- wise unrelated process and begin tracing it. It does not
- need any cooperation from the to-be-traced process. In
- this case, _p_i_d specifies the process ID of the to-be-traced
- process, and the other two arguments are ignored. This re-
- quest requires that the target process must have the same
- real UID as the tracing process, and that it must not be
- executing a setuid or setgid executable. (If the tracing
- process is running as root, these restrictions do not ap-
- ply.) The tracing process will see the newly-traced pro-
- cess stop and may then control it as if it had been traced
- all along.
-
- PT_DETACH This request is like PT_CONTINUE, except that it does not
- allow specifying an alternate place to continue execution,
- and after it succeeds, the traced process is no longer
- traced and continues execution normally.
-
- Additionally, machine-specific requests can exist. On the SPARC, these
- are:
-
- PT_GETREGS This request reads the traced process' machine registers
- into the ``struct reg'' (defined in <_m_a_c_h_i_n_e_/_r_e_g_._h>) point-
- ed to by _a_d_d_r.
-
- PT_SETREGS This request is the converse of PT_GETREGS; it loads the
- traced process' machine registers from the ``struct reg''
- (defined in <_m_a_c_h_i_n_e_/_r_e_g_._h>) pointed to by _a_d_d_r.
-
- PT_GETFPREGS This request reads the traced process' floating-point reg-
- isters into the ``struct fpreg'' (defined in
- <_m_a_c_h_i_n_e_/_r_e_g_._h>) pointed to by _a_d_d_r.
-
- PT_SETFPREGS This request is the converse of PT_GETFPREGS; it loads the
- traced process' floating-point registers from the ``struct
- fpreg'' (defined in <_m_a_c_h_i_n_e_/_r_e_g_._h>) pointed to by _a_d_d_r.
-
- PT_SYSCALL This request is like PT_CONTINUE except that the process
- will stop next time it executes any system call. Informa-
- tion about the system call can be examined with PT_READ_U
- and potentially modified with PT_WRITE_U through the
- u_kproc.kp_proc.p_md element of the user structure (see be-
- low). If the process is continued with another PT_SYSCALL
- request, it will stop again on exit from the syscall, at
- which point the return values can be examined and poten-
- tially changed. The u_kproc.kp_proc.p_md element is of
- type ``struct mdproc'', which should be declared by includ-
- ing <_s_y_s_/_p_a_r_a_m_._h>, <_s_y_s_/_u_s_e_r_._h>, and <_m_a_c_h_i_n_e_/_p_r_o_c_._h>, and
- contains the following fields (among others):
- syscall_num
- syscall_nargs
- syscall_args[8]
- syscall_err
- syscall_rv[2]
- When a process stops on entry to a syscall, syscall_num
- holds the number of the syscall, syscall_nargs holds the
- number of arguments it expects, and syscall_args holds the
- arguments themselves. (Only the first syscall_nargs ele-
- ments of syscall_args are guaranteed to be useful.) When a
- process stops on exit from a syscall, syscall_num is -1,
- syscall_err holds the error number (see errno(2)), or 0 if
- no error occurred, and syscall_rv holds the return values.
- (If the syscall returns only one value, only syscall_rv[0]
- is useful.) The tracing process can modify any of these
- with PT_WRITE_U; only some modifications are useful.
-
- On entry to a syscall, syscall_num can be changed, and the
- syscall actually performed will correspond to the new num-
- ber (it is the responsibility of the tracing process to
- fill in syscall_args appropriately for the new call, but
- there is no need to modify syscall_nargs). If the new
- syscall number is 0, no syscall is actually performed; in-
- stead, syscall_err and syscall_rv are passed back to the
- traced process directly (and therefore should be filled
- in). If the syscall number is otherwise out of range, a
- dummy syscall which simply produces an ENOSYS error is ef-
- fectively performed.
-
- On exit from a syscall, only syscall_err and syscall_rv can
- usefully be changed; they are set to the values returned by
- the syscall and will be passed back to the traced process
- by the normal syscall return mechanism.
-
- EERRRROORRSS
- Some requests can cause ppttrraaccee() to return -1 as a non-error value; to
- disambiguate, _e_r_r_n_o can be set to 0 before the call and checked after-
- wards. The possible errors are:
-
- [ESRCH]
- No process having the specified process ID exists.
-
- [EINVAL]
- ++oo A process attempted to use PT_ATTACH on itself.
- ++oo The _r_e_q_u_e_s_t was not one of the legal requests.
- ++oo The _a_d_d_r to PT_READ_U or PT_WRITE_U was not int-aligned.
- ++oo The signal number (in _d_a_t_a) to PT_CONTINUE or PT_SYSCALL was
- neither 0 nor a legal signal number.
- ++oo PT_GETREGS, PT_SETREGS, PT_GETFPREGS, or PT_SETFPREGS was at-
- tempted on a process with no valid register set. (This is nor-
- mally true only of system processes.)
-
- [EBUSY]
- ++oo PT_ATTACH was attempted on a process that was already being
- traced.
- ++oo A request attempted to manipulate a process that was being
- traced by some process other than the one making the request.
- ++oo A request (other than PT_ATTACH) specified a process that
- wasn't stopped.
-
- [EPERM]
- ++oo A request (other than PT_ATTACH) attempted to manipulate a pro-
-
-
- cess that wasn't being traced at all.
- ++oo An attempt was made to use PT_ATTACH on a process in violation
- of the requirements listed under PT_ATTACH above.
-
- BBUUGGSS
- On the SPARC, the PC is set to the provided PC value for PT_CONTINUE and
- similar calls, but the NPC is set willy-nilly to 4 greater than the PC
- value. Using PT_GETREGS and PT_SETREGS to modify the PC, passing
- (caddr_t)1 to ppttrraaccee(), should be able to sidestep this.
-
- Single-stepping is not available.
-
- When using PT_SYSCALL, there is no easy way to tell whether the traced
- process stopped because it made a syscall or because a signal was sent at
- a moment that it just happened to have valid-looking garbage in its
- ``struct mdproc''.
-
- NetBSD November 7, 1994 4
-